package com.dy.design_pattern_study.adaptor_pattern.dome2;

import com.dy.design_pattern_study.adaptor_pattern.dome2.impl.Center;
import com.dy.design_pattern_study.adaptor_pattern.dome2.impl.Forwards;
import com.dy.design_pattern_study.adaptor_pattern.dome2.impl.Guards;
import com.dy.design_pattern_study.adaptor_pattern.dome2.impl.Translator;

/**
 * @CreateBy zhangdingyi
 * @Date 2023-04-07
 * @Content 适配器模式（Adapter），将一个类的接口转换成客户希望的另外一个接口。
 * Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
 * 简单的说，在不能修改项目的前提下，自己仅能做修改某个方法的具体实现来替换方法
 * 根据实际功能来调用不同子类的同名方法 -重写
 * <p>
 * 在什么时候使用？
 * 1.系统的数据和行为都正确，但接口不符时，我们应该考虑用适配器，
 * 目的是使控制范围之外的一个原有对象与某个接口匹配。
 * 适配器模式主要应用于希望复用一些现存的类，但是接口又与复用环境要求不一致的情况
 * --简单的说 之前的代码没问题，但出现了额外的情况需要处理，这时候需要适配器来替换不同情况的功能实现
 * <p>
 * 2.使用一个已经存在的类，但如果它的接口，也就是它的方法和你的要求不相同时，就应该考虑用适配器模式
 * 两个类所做的事情相同或相似，但是具有不同的接口时要使用它
 * --------A类 和 接口A ，接口A 只有A功能，现在想要A类有B功能，但不能舍弃接口A，这时候需要适配器模式
 * <p>
 * 3.不同的开发人员、不同的产品、不同的厂家而造成功能类似而接口不同的情况
 * 通常是在软件开发后期或维护期再考虑使用它，在双方都不太容易修改的时候再使用适配器模式适配
 * ---------如 数据库 mysql 和 oracle，功能类似，但实际接口不同，这时候需要用适配器模式，把其不同接口隐藏起来，仅公开相同的方法名，
 * 在配置文件中对不同的数据库进行设置即可使用不同的数据库。
 * <p>
 * <p>
 * 4.组件的接口与我们自己的系统接口是不相同的，而我们也完全没有必要为了迎合它而改动自己的接口，
 * 此时尽管是在开发的设计阶段，也是可以考虑用适配器模式来解决接口不同的问题
 * ---------设计阶段，使用到人家不同组件的接口，这时候用适配器模式，可以解决接口不同问题
 * <p>
 * 简单的说，这个主要还是用在，接口不同，但想要使用对应的功能上面，按照开放-封闭法则，以前的不能改，新增的可以因此适配器就显得尤为好用
 * 适配器模式就是不同接口之间为了能够克服接口的不同，而直接调用这些不同的接口的模式
 */
public class client {

    public static void main(String[] args) {
        Player p1 = new Forwards("A1Q");
        p1.attack();

        Player p2 = new Center("A1Z");
        p2.defense();

        Player p3 = new Guards("A1H");
        p3.defense();

        //适配器模式调用
        Player spq = new Translator("S1Z");
        spq.attack();
        spq.defense();
    }
}
